package homes;

import juego.Usuario;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Example;

import excepcionesDelJuego.UserOPasswordInvalidoException;
import excepcionesDelJuego.UsuarioExistenteException;
import excepcionesDelJuego.UsuarioInexistenteException;


public class UsuarioHome {

	public Session sesion() {

		return SessionManager.thread.get();

	}

	public void save(Usuario usuario) {
		if (!existeUsuario(usuario)) {
			sesion().save(usuario);
		} else {
			throw new UsuarioExistenteException();
		}
	}

	public void delete(Usuario usuario) {
		if (existeUsuario(usuario)) {	
			sesion().delete(sesion().merge(usuario));
		} else {
			throw new UsuarioInexistenteException();
		}
	}

	public boolean existeUsuario(Usuario usr) {
		Usuario u = new Usuario();
		u.setUsuario(usr.getUsuario());
		Criteria q = sesion().createCriteria(Usuario.class);
		Example e = Example.create(usr);
		q.add(e);
		return q.uniqueResult() != null;
	}

	public Usuario logIn(String usr, String pass) {
		Query q = sesion().createQuery(
				"from Usuario where usuario = :usu and pass= :pass");
		q.setString("usu", usr);
		q.setString( "pass", pass);
		if (q.uniqueResult() != null) {
			return (Usuario) q.uniqueResult();
		} else {
			throw new UserOPasswordInvalidoException();
		}

	}
	
	public void update(Usuario u){
		sesion().update(sesion().merge(u));
	}

}
